package sh.orm.util;

import lombok.extern.slf4j.Slf4j;
import sh.orm.OrmException;
import sh.orm.convert.JdbcType;

import java.sql.ResultSet;
import java.sql.ResultSetMetaData;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.HashMap;
import java.util.Map;

/**
 * 处理ResultSet的工具类
 * @author lqq
 * @date 2019/1/23
 */
@Slf4j
public class ResultSetUtil {


    /**
     * 把ResultSet里的值转换为Map的形式
     * @param columnFieldMap
     * @param rs 不能为空，这里的结果集是已经定位好的，直接拿来用，也不做循环处理
     * @return
     */
    public static Map<String,Object> convertResultSet2Map(Map<String,String> columnFieldMap ,ResultSet rs) {
        if(rs == null){
            throw new OrmException("传入的结果集参数为空");
        }

        Map<String,Object> fieldValueMap = new HashMap<>();

        try {
            for(Map.Entry<String,String> entry : columnFieldMap.entrySet()){
                fieldValueMap.put(entry.getValue(), rs.getObject(entry.getKey()));
            }
        } catch (SQLException e) {
            e.printStackTrace();
            throw  new OrmException("resultSet next 方法出现异常" + e.getMessage());
        }
        return fieldValueMap;
    }

    /**
     * 通过ResultSet获取返回值类型
     * 返回结果集中的字段和类型的映射map
     * @param resultSet
     * @return
     */
    public static Map<String,JdbcType> getColumnNameJdbcTypeMap(ResultSet resultSet) {
        Map<String,JdbcType> map = new HashMap<>();
        try {
            return getColumnNameJdbcTypeMap(resultSet.getMetaData());
        } catch (SQLException e) {
            e.printStackTrace();
            throw new OrmException("获取元数据信息异常" + e.getMessage());
        }
    }

    public static Map<String,JdbcType> getColumnNameJdbcTypeMap(ResultSetMetaData rsmd) {
        Map<String,JdbcType> map = new HashMap<>();
        try {
            //表列数
            int size = rsmd.getColumnCount();
            for (int i = 0; i < size; i++) {
                //TODO 使用valueof 没有DATETIME 类型
                //map.put(rsmd.getColumnName(i + 1), JdbcType.valueOf(rsmd.getColumnTypeName(i + 1)));
                map.put(rsmd.getColumnName(i + 1), JdbcType.forCode( rsmd.getColumnType(i + 1)));
            }
            return map;
        } catch (SQLException e) {
            e.printStackTrace();
            throw new OrmException("获取元数据信息异常" + e.getMessage());
        }
    }



}
